import { getFilesByPageOptions, rootMapType, allFilesNameAndPathItemType } from "./allFiles.type";

import { defineStore } from "pinia";
const allFilesModuleToString = import.meta.glob("/src/project/**/**/*.{html,js,css,json,md,vue}", { as: "raw" });
const allFilesModule = import.meta.glob("/src/project/**/**/*.{html,js,css,json,md,vue}");
// const allFilesModuleToString = import.meta.glob("/src/project/**/**/*", { as: "raw" });
// const allFilesModule = import.meta.glob("/src/project/**/**/*");
const rootMap: rootMapType = {
  html: ["index.html", "Index.html"],
  javascript: ["index.js", "Index.js"],
  markdown: ["index.md", "Index.md"],
  vue2: ["index.vue", "Index.vue"],
  vue3: ["index.vue", "Index.vue"],
};

const allFilesNameAndPath: allFilesNameAndPathItemType[] = Object.keys(allFilesModule).map((path: string) => {
  const parts = path.split("/"); // 根据路径拆分的数组
  let pathArr = path.split("/");
  pathArr.splice(pathArr.length - 1, 1);
  const base = pathArr.join("/") + "/";
  const nameAndID = parts[parts.length - 2].split("."); // 名称
  const name = nameAndID[nameAndID.length - 1];
  const ID = nameAndID.length == 2 ? Number(nameAndID[0]) : null;
  const type = parts[parts.length - 3] || ""; // 类型
  const fileName = parts[parts.length - 1].split(".")[0]; // 文件名
  const entirely = parts[parts.length - 1].split(".")[1];
  const fileNameEntirely = parts[parts.length - 1]; // 文件名+后缀
  const isRoot = rootMap[type]?.includes(fileNameEntirely) || false; // 是否是根文件
  return {
    path,
    base,
    ID,
    name,
    fileName,
    entirely,
    fileNameEntirely,
    type,
    isRoot,
    moduleToString: allFilesModuleToString[path],
    module: allFilesModule[path],
  };
});

export const useAllFiles = defineStore("allFiles", {
  state: () => {
    // 数据
    return {
      allFilesModuleToString: allFilesModuleToString, // 所有文件模块转化为字符串{路径:函数}
      allFilesModule: allFilesModule, // 所有文件模块{路径:函数}
    };
  },
  getters: {
    // 所有文件路径
    allFilesPath(state): string[] {
      return Object.keys(state.allFilesModule);
    },
    // 所有文件信息
    allFilesNameAndPath(): allFilesNameAndPathItemType[] {
      return allFilesNameAndPath;
    },
    // 分组后所有文件信息
    allFilesPathGroup(): { [key: string]: allFilesNameAndPathItemType[] } {
      return allFilesNameAndPath.reduce((acc: any, info: any) => {
        // 提取文件扩展名（不包括点）
        const extension = info.type || "noExtension";
        if (!acc[extension]) {
          acc[extension] = [];
        }
        acc[extension].push(info);
        return acc;
      }, {});
    },
  },
  actions: {
    /**
     *
     * @param options 搜索参数
     * @param options.name 文件名称
     * @param options.type 文件类型
     * @returns
     */
    searchFileByName(options: any = { name: "", type: "", root: false }): allFilesNameAndPathItemType[] {
      let { name = "", type = "", root = false } = options;
      if (!name) {
        return [];
      }
      return this.allFilesNameAndPath.filter((item: any) => {
        if (type && root) {
          return item.name.toLowerCase().includes(name.toLowerCase()) && item.type === type && item.isRoot;
        } else if (type) {
          return item.name.toLowerCase().includes(name.toLowerCase()) && item.type === type;
        } else if (root) {
          return item.name.toLowerCase().includes(name.toLowerCase()) && item.isRoot;
        } else {
          return item.name.toLowerCase().includes(name.toLowerCase());
        }
      });
    },
    /**
     * 通过路径查询单个文件
     * @param path 路径
     * @returns 文件信息
     */
    searchFileByPath(path: string): allFilesNameAndPathItemType {
      return this.allFilesNameAndPath.find((item: any) => item.path === path) as allFilesNameAndPathItemType;
    },
    /**
     * 通过根路径查询文件夹中的内容
     * @param base 根路径
     * @returns 文件夹中的所有文件
     */
    searchFilesBybase(base: string): allFilesNameAndPathItemType[] | [] {
      return this.allFilesNameAndPath.filter((item: any) => item.base === base) || [];
    },
    /**
     * 通过分页获取文件
     * @param options 配置
     * @param options.page 页码
     * @param options.pageSize 每页数量
     * @param options.type 文件类型
     * @param options.fileName 文件名称
     * @param options.sort 排序 asc 升序 desc 降序
     * @returns
     */
    getFilesByPage(options: getFilesByPageOptions = { page: 1, pageSize: 10, type: "html", fileName: "", sort: "desc" }): {
      list: allFilesNameAndPathItemType[];
      total: number;
    } {
      const { page = 1, pageSize = 10, type = "html", fileName = "", sort = "desc" } = options;
      const startIndex = (page - 1) * pageSize;
      const endIndex = startIndex + pageSize;
      // 将搜索名称转换为小写，仅计算一次
      const lowerCaseName = fileName?.toLowerCase();
      let rootFiles =
        this.allFilesPathGroup[type]
          .filter((item: any) => item.isRoot && (!fileName || item.name.toLowerCase().includes(lowerCaseName)))
          ?.sort((a: any, b: any) => {
            if (a.ID === null) return 1; // 如果 a 是 null，则将 a 放在后面
            if (b.ID === null) return -1; // 如果 b 是 null，则将 b 放在后面
            if (sort === "asc") {
              return a.ID - b.ID;
            } else {
              return b.ID - a.ID;
            }
          }) ?? [];
      return {
        list: rootFiles.slice(startIndex, endIndex),
        total: rootFiles.length,
      };
    },
    // 根据类型查询主文件
    getFilesByType(type = "html", sort = "desc"): allFilesNameAndPathItemType[] {
      return (
        this.allFilesPathGroup[type]
          .filter((item: any) => item.isRoot)
          ?.sort((a: any, b: any) => {
            if (a.ID === null) return 1; // 如果 a 是 null，则将 a 放在后面
            if (b.ID === null) return -1; // 如果 b 是 null，则将 b 放在后面
            if (sort === "asc") {
              return a.ID - b.ID;
            } else {
              return b.ID - a.ID;
            }
          }) ?? []
      );
    },
  },
});
